1 데이터

1.1 대선

library(tidyverse)

## 2012년 대선
gg_2012_raw <- krvote::election_20121219$득표율 %>% 
  filter(str_detect(시도명, "경기")) %>% 
  select(-선거인수, - 투표수) %>% 
  pivot_longer(박근혜:김순자, names_to = "후보", values_to = "득표수")  %>% 
  mutate(정당 = case_when(str_detect(후보, "박근혜") ~ "국민의힘",
                          str_detect(후보, "문재인") ~ "민주당",
                          TRUE ~ "그외정당")) %>% 
  group_by(시도명, 구시군명, 정당) %>% 
  summarise( 득표수 = sum(득표수, na.rm = TRUE)) %>% 
  mutate(선거 = "2012년") %>% 
  ungroup()

## 2017년 대선
gg_2017_raw <- krvote::election_20170509$득표율 %>% 
  filter(str_detect(시도명, "경기")) %>% 
  select(-선거인수, - 투표수) %>% 
  pivot_longer(문재인:김민찬, names_to = "후보", values_to = "득표수")  %>% 
  mutate(정당 = case_when(str_detect(후보, "홍준표") ~ "국민의힘",
                          str_detect(후보, "안철수") ~ "국민의힘",
                          str_detect(후보, "유승민") ~ "국민의힘",
                          str_detect(후보, "문재인") ~ "민주당",
                          TRUE ~ "그외정당")) %>% 
  group_by(시도명, 구시군명, 정당) %>% 
  summarise( 득표수 = sum(득표수, na.rm = TRUE)) %>% 
  mutate(선거 = "2017년") %>% 
  ungroup()

## 2017년 대선
gg_2022_raw_excel <- readxl::read_excel("data/2022년_개표결과_대통령선거_전체.xlsx") 

gg_2022_raw <- gg_2022_raw_excel %>% 
  filter(str_detect(시도, "경기")) %>% 
  mutate(읍면동명 = ifelse(is.na(읍면동명), 구시군, 읍면동명),
         투표구명 = ifelse(is.na(투표구명), 읍면동명, 투표구명)) %>% 
  filter(!str_detect(구시군, "합계"),
         !str_detect(읍면동명, "합계"),
         !str_detect(투표구명, "소계")) %>% 
  janitor::clean_names(ascii = FALSE) %>% 
  select(-선거인수, - 투표수, -무효투표수, -기권수) %>% 
  pivot_longer(더불어민주당_이재명:한류연합당_김민찬, names_to = "후보", values_to = "득표수") %>% 
  separate(후보, into = c("정당", "후보"), sep = "_") %>% 
  mutate(득표수 = parse_number(득표수),
= parse_number(계)) %>% 
  mutate(정당 = case_when(str_detect(후보, "이재명") ~ "민주당",
                          str_detect(후보, "윤석열") ~ "국민의힘",
                          TRUE ~ "그외정당")) %>% 
  rename(시도명 = 시도, 
         구시군명 = 구시군) %>% 
  group_by(시도명, 구시군명, 정당) %>% 
  summarise( 득표수 = sum(득표수, na.rm = TRUE)) %>% 
  mutate(선거 = "2022년") %>% 
  ungroup()

1.2 총선

## 2016년 총선 -----------------------
gg_2016_raw <- krvote::general_2016 %>% 
  filter(시도 == "경기") %>% 
  unnest(data) %>% 
  mutate(구시군명 = case_when(
                        str_detect(선거구, "고양시") ~ "고양시",
                        str_detect(선거구, "부천시") ~ "부천시",
                        str_detect(선거구, "성남시") ~ "성남시",
                        str_detect(선거구, "수원시") ~ "수원시",
                        str_detect(선거구, "안산시") ~ "안산시",
                        str_detect(선거구, "안양시") ~ "안양시",
                        str_detect(선거구, "용인시") ~ "용인시",
                        str_detect(선거구, "광명시") ~ "광명시",
                        str_detect(선거구, "광주시") ~ "광주시",
                        str_detect(선거구, "군포시") ~ "군포시",
                        str_detect(선거구, "김포시") ~ "김포시",
                        str_detect(선거구, "남양주") ~ "남양주",
                        str_detect(선거구, "의정부") ~ "의정부",
                        str_detect(선거구, "화성시") ~ "화성시",
                        str_detect(선거구, "파주시") ~ "파주시",
                        str_detect(선거구, "평택시") ~ "평택시",
                        str_detect(선거구, "시흥시") ~ "시흥시",
                        TRUE ~ 선거구))  %>% 
  group_by(구시군명, 구분) %>% 
  summarise(득표수 = sum(사람수)) %>% 
  ungroup() 


gg_2016_dat <- gg_2016_raw %>% 
  filter( str_detect(구분, "국민의당|노동당|녹색당|더불어민주당|무소속|민중연합당|새누리당|정의당")) %>% 
  separate(구분, into = c("정당", "후보"), sep = " ") %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표수 = sum(득표수, na.rm = TRUE)) %>% 
  # left_join( gg_2016_raw %>% filter(구분 == "계") %>% rename(합계 = 득표수)) %>% 
  ungroup() %>% 
  mutate(선거 = "2016년")

## 2020년 총선 -----------------------
gg_2020_raw <- krvote::general_2020 %>% 
  filter(시도 == "경기") %>% 
  unnest(data) %>% 
  mutate(구시군명 = case_when(
                        str_detect(선거구, "고양시") ~ "고양시",
                        str_detect(선거구, "부천시") ~ "부천시",
                        str_detect(선거구, "성남시") ~ "성남시",
                        str_detect(선거구, "수원시") ~ "수원시",
                        str_detect(선거구, "안산시") ~ "안산시",
                        str_detect(선거구, "안양시") ~ "안양시",
                        str_detect(선거구, "용인시") ~ "용인시",
                        str_detect(선거구, "광명시") ~ "광명시",
                        str_detect(선거구, "광주시") ~ "광주시",
                        str_detect(선거구, "군포시") ~ "군포시",
                        str_detect(선거구, "김포시") ~ "김포시",
                        str_detect(선거구, "남양주") ~ "남양주",
                        str_detect(선거구, "의정부") ~ "의정부",
                        str_detect(선거구, "화성시") ~ "화성시",
                        str_detect(선거구, "파주시") ~ "파주시",
                        str_detect(선거구, "평택시") ~ "평택시",
                        str_detect(선거구, "시흥시") ~ "시흥시",
                        TRUE ~ 선거구))  %>% 
  group_by(구시군명, 구분) %>% 
  summarise(득표수 = sum(사람수)) %>% 
  ungroup()

gg_2020_dat <- gg_2020_raw %>% 
  filter( str_detect(구분, "국가혁명배당금당|기독자유통일당|기본소득당|더불어민주당|무소속|미래통합당|민생당|민중당|우리공화당|정의당|친박신당")) %>% 
  separate(구분, into = c("정당", "후보"), sep = " ") %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표수 = sum(득표수, na.rm = TRUE)) %>% 
  # left_join( gg_2020_raw %>% filter(구분 == "계") %>% rename(합계 = 득표수)) %>% 
  ungroup() %>% 
  mutate(선거 = "2020년")

1.3 지선

## 2014년 지방선거

clean_df <- function(raw_df) {
  clean_df <- raw_df %>% 
    pivot_longer(선거인수:기권수)
  return(clean_df)
}

gg_2014_raw <- krvote::local_sgg_20140604$경기도 %>% 
  mutate(clean_data = map(data, clean_df) )

gg_2014_total <- gg_2014_raw %>% 
  select(-data) %>% 
  unnest(clean_data) %>% 
  separate(name, into = c("정당", "후보"), sep = "\n") %>% 
  filter(정당 == "계") %>% 
  group_by(시도명, 구시군) %>% 
  summarise(합계 = sum(value)) %>% 
  ungroup()

gg_2014_dat <- gg_2014_raw %>% 
  select(-data) %>% 
  unnest(clean_data) %>% 
  separate(name, into = c("정당", "후보"), sep = "\n") %>% 
  filter(str_detect(정당, "녹색당|무소속|새누리당|새정치당|새정치민주연합|정의당|통합진보당")) %>% 
  group_by(시도명, 구시군, 정당) %>% 
  summarise(득표수 = sum(value)) %>% 
  ungroup() %>% 
  # left_join( gg_2014_total ) %>% 
  mutate(선거 = "2014년") %>% 
  select(선거, 구시군명 = 구시군, 정당, 득표수)


## 2018년 지방선거

gg_2018_raw <- krvote::local_sgg_20180613 %>% 
  filter(시도 == "경기도") %>% 
  mutate(clean_data = map(data, clean_df) ) %>% 
  select(-data) %>% 
  unnest(clean_data) %>% 
  separate(name, into = c("정당", "후보"), sep = "_") %>% 
  mutate(구시군명 = case_when(
                      str_detect(구시군명, "고양시") ~ "고양시",
                      str_detect(구시군명, "부천시") ~ "부천시",
                      str_detect(구시군명, "성남시") ~ "성남시",
                      str_detect(구시군명, "수원시") ~ "수원시",
                      str_detect(구시군명, "안산시") ~ "안산시",
                      str_detect(구시군명, "안양시") ~ "안양시",
                      str_detect(구시군명, "용인시") ~ "용인시",
                      str_detect(구시군명, "광명시") ~ "광명시",
                      str_detect(구시군명, "광주시") ~ "광주시",
                      str_detect(구시군명, "군포시") ~ "군포시",
                      str_detect(구시군명, "김포시") ~ "김포시",
                      str_detect(구시군명, "남양주") ~ "남양주",
                      str_detect(구시군명, "의정부") ~ "의정부",
                      str_detect(구시군명, "화성시") ~ "화성시",
                      str_detect(구시군명, "파주시") ~ "파주시",
                      str_detect(구시군명, "평택시") ~ "평택시",
                      str_detect(구시군명, "시흥시") ~ "시흥시",
                      TRUE ~ 구시군명))  
  
gg_2018_total <- gg_2018_raw %>%   
  filter(정당 == "계") %>% 
  group_by(시도명, 구시군명) %>% 
  summarise(합계 = sum(value)) %>% 
  ungroup()

gg_2018_dat <- gg_2018_raw %>% 
  filter(str_detect(정당, "대한애국당|더불어민주당|무소속|민주평화당|민중당|바른미래당|자유한국당|정의당")) %>% 
  group_by(시도명, 구시군명, 정당) %>% 
  summarise(득표수 = sum(value)) %>% 
  ungroup() %>% 
  # left_join( gg_2018_total )
  mutate(선거 = "2018년") %>% 
  select(선거, 구시군명, 정당, 득표수)

1.4 * 종합

## 데이터 결합

gg_raw <- bind_rows(gg_2012_raw, gg_2017_raw) %>% 
  bind_rows(gg_2022_raw) %>% 
  select(선거, 구시군명, 정당, 득표수) %>% 
  bind_rows(gg_2020_dat) %>% 
  bind_rows(gg_2016_dat) %>% 
  bind_rows(gg_2014_dat) %>% 
  bind_rows(gg_2018_dat)

gg_raw %>% 
  write_rds("data/gg_raw.rds")

2 시각화

2.1

gg_raw_tbl <- gg_raw %>% 
  group_by(선거, 정당) %>% 
  summarise(득표수 = sum(득표수)) %>% 
  ungroup() %>% 
  mutate(득표율 = 득표수 / 합계) 
gg_raw_tbl %>% 
  mutate(text = glue::glue("{scales::comma(득표수)} / {scales::comma(합계)} = {scales::percent(득표율, 0.1)}")) %>% 
  select(선거, 정당, text) %>% 
  pivot_wider(names_from = 정당, values_from = text) %>% 
  select(선거, 민주당, 국민의힘, 그외정당)

2.2 그래프

gg_raw_tbl %>% 
  ggplot(aes(x = 선거, y = 득표율, color = 정당, group = 정당)) +
    geom_point() +
    geom_line()

3 echarts

# https://www.infoworld.com/article/3607068/plot-in-r-with-echarts4r.html

library(echarts4r)
gg_raw %>%
  group_by(선거) %>% 
  summarise(득표수 = sum(득표수) ) %>% 
  ungroup() %>% 
  e_charts(x = 선거) %>% 
  e_line(serie = 득표수)

4 echarts 지도

library(echarts4r)
library(echarts4r.maps)

e_charts() %>%
  em_map("South_Korea") %>% 
  e_map(map = "South_Korea") %>% 
  e_visual_map()

5 echarts globe

library(echarts4r.assets)

airports <- read.csv(
  paste0("https://raw.githubusercontent.com/plotly/datasets/",
         "master/2011_february_us_airport_traffic.csv")
)

airports |> 
  e_charts(long) |> 
  e_globe(
    environment = ea_asset("starfield"),
    base_texture = ea_asset("world"), 
    globeOuterRadius = 100
  ) |> 
  e_scatter_3d(lat, cnt, coord_system = "globe", blendMode = 'lighter') |> 
  e_visual_map(inRange = list(symbolSize = c(1, 10)))
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com